package gw.com.android.ui.me_concern;

import android.app.Activity;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.gwtsz.gts2.hx.R;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import gw.com.android.utils.PackStatis;

/**
 * 分析师的RecyclerViewAdapter
 */
public class MyConcernRecyclerViewAdapter extends RecyclerView.Adapter<MyConcernRecyclerViewAdapter.ViewHolder> {

    private List<AnalystData> analystList;
    private Context mContext;
    private LayoutInflater mInflater;

    public MyConcernRecyclerViewAdapter(List<AnalystData> analystList, Context context) {
        this.mContext = context;
        this.analystList = analystList;
        mInflater = ((Activity) context).getLayoutInflater();
        initCheckboxStatus();
    }

    public void setData(List<AnalystData> list) {
        List<AnalystData> temp = new ArrayList<>();
        if (!ifAlloweSwip)// 如果不允许滑动，就是待关注list，就要加上页头
            temp.add(new AnalystData());//这里是为了用一个空白位表示header
        temp.addAll(list);

        this.analystList = temp;
        //初始化所有checkbox的状态列表
        initCheckboxStatus();
        notifyDataSetChanged();
    }

    private void initCheckboxStatus() {
        checkBoxStatus.clear();
        for (int i = 1; i <= analystList.size(); i++) {
            checkBoxStatus.put(i, true);
        }
    }

    /**
     * 第一件事，在内部，创建一个RecyclerView.ViewHolder的继承类，用他来统筹列表的每一个item内的所有组件
     */
    class ViewHolder extends RecyclerView.ViewHolder {

        // 写出这个holder可以统筹的所有子控件
        TextView tv_analyst_name;
        TextView tv_position;
        TextView tv_winRate;
        TextView tv_gain;
        ImageView civ_head;
        CheckBox cb_selected;
        MyConcernHorizontalSlideLayout layout_slide;

        TextView tv_quick_add_concern;
        LinearLayout ll_no_concern;

        public ViewHolder(View itemView) {
            super(itemView);
            tv_analyst_name = (TextView) itemView.findViewById(R.id.tv_analyst_name);
            tv_position = (TextView) itemView.findViewById(R.id.tv_position);
            tv_winRate = (TextView) itemView.findViewById(R.id.tv_winRate);
            tv_gain = (TextView) itemView.findViewById(R.id.tv_gain);
            layout_slide = (MyConcernHorizontalSlideLayout) itemView.findViewById(R.id.layout_slide);
            civ_head = (ImageView) itemView.findViewById(R.id.civ_head);
            cb_selected = (CheckBox) itemView.findViewById(R.id.cb_selected);
            if (null != layout_slide)
                layout_slide.hideMenu();

            ll_no_concern = (LinearLayout) itemView.findViewById(R.id.ll_no_concern);
            tv_quick_add_concern = (TextView) itemView.findViewById(R.id.tv_quick_add_concern);

        }
    }


    /**
     * 第二件事，实现父类的3个方法
     * <p>
     * onCreateViewHolder 创建子view，同时创建子view的holder对象
     *
     * @param parent
     * @param viewType
     * @return
     */
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {// 这里，把listView的viewHolder思想融合了进去，直接用一个独立方法来返回ViewHolder对象
        View itemView;
        if (viewType == VIEW_TYPE_0)
            itemView = mInflater.inflate(R.layout.myconcern_analyst_head, parent, false);
        else
            itemView = mInflater.inflate(R.layout.myconcern_analyst, parent, false);
        return new ViewHolder(itemView);
    }

    public void setIfAllowSwipe(boolean ifAllowSwipe) {
        this.ifAlloweSwip = ifAllowSwipe;
    }

    private boolean ifAlloweSwip;//是否允许滑动

    //用一个list保存checkbox的状态
    private Map<Integer, Boolean> checkBoxStatus = new HashMap<>();

    /**
     * 根据position返回界面item数据对象
     */
    public AnalystData getItem(int position) {
        if (analystList != null) {
            if (position >= 0 && position < analystList.size()) {
                return analystList.get(position);
            }
        }
        return null;
    }

    /**
     * 用每一个holder对象,来设置每一个子view的控件
     *
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {// 这里，有两个参数，第一个是holder对象，第二个是position，想想，list.get(0).
        AnalystData mItem = getItem(position);//item 复用
        if (ifAlloweSwip)
            holder.setIsRecyclable(false);//这里禁用 RecyclerView的复用机制，是由于，每一个item都是可左滑的自定义控件，这里如果复用了已经展开的item，会很麻烦，要控制item回缩（关键是现在没有完美方案解决回缩，总是有瑕疵）
        //并且，分析师数目并不太多，最多也就20个.不会太影响效率。但是，话说回来，这里的isRecyclable用起来还是要慎重，在有大量数据需要加载的时候，分页加载的时候，还是需要打开复用机制的。
        if (null != mItem) {
            if (position == 0) {//list中index为0 的，是list头
                // 如果 ifAlloweSwip 是true，允许滑动，就是已关注list，已关注列表，不需要头,
                if (!ifAlloweSwip) {//不允许滑动，就说明，这个是待关注list,位置0是header
                    initHeader(holder);
                } else {
                    initListItem(holder, position);
                }
            } else {//正常数据
                initListItem(holder, position);
            }
        }
    }

    private void initHeader(ViewHolder holder) {
        //头里面，只需要设置按钮的点击事件
        //找到一键关注的按钮
        holder.tv_quick_add_concern.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                PackStatis.getToService("clickAtOnce", PackStatis.EventCategory.ME.getValue(), null, null);
                operatorCallback.quickFollowAnalyst();
            }
        });
    }

    private void initListItem(ViewHolder holder, final int position) {
        String name = analystList.get(position).userName;
        final String position_Str = analystList.get(position).position;
        String winRate = analystList.get(position).winRate;
        String gain = analystList.get(position).gain;
        String avastar = analystList.get(position).avatar;
        final String analystNo = analystList.get(position).userNo;//分析师账号，用来唯一标识分析师 60051330
        final String userNo = analystList.get(position).accountNo;// hxbj
        // 拿到子控件 并且 赋值
        holder.tv_analyst_name.setText(name);
        holder.tv_position.setText(position_Str);
        holder.tv_winRate.setText(TextUtils.isEmpty(winRate) ? "  --  " : winRate);
        holder.tv_gain.setText(TextUtils.isEmpty(gain) ? "  --  " : gain);

        if (holder.layout_slide.mStatus == MyConcernHorizontalSlideLayout.STATUS_EXPAND) {
            Log.d("ppaxd", "复用了一个已经展开的组件");
            holder.layout_slide.hideMenu();//看来，不管是不是允许滑动，重新加载item的时候都必须收缩起来
        }

        holder.layout_slide.setIfAllowSwip(ifAlloweSwip);// 设置是否允许滑动
//        holder.layout_slide.setIfAllowSwip(true);// 设置允许滑动//TODO
        //两种模式，
        if (ifAlloweSwip) {//如果是允许滑动，那么就隐藏checkbox，并且设置布局可以左滑
            holder.cb_selected.setVisibility(View.GONE);//让checkbox暂时隐藏，阻止滑动
        } else {
            holder.cb_selected.setVisibility(View.VISIBLE);//让checkbox显示
            holder.cb_selected.setOnCheckedChangeListener(null);//先取消该事件
            holder.cb_selected.setChecked(checkBoxStatus.get(position + 1));//再置入check状态
            holder.cb_selected.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {//再事件check事件
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    operatorCallback.analystCheckedChanged(analystNo, isChecked);
                    Log.d("onCheckedChanged", "position:" + position + "-isChecked:" + isChecked);
                    checkBoxStatus.put(position + 1, isChecked);
                }
            });
        }

        Glide.with(mContext).load(avastar)
                .placeholder(R.mipmap.a_show_profiles)
                .error(R.mipmap.a_show_profiles)
                .dontAnimate()//防止设置placeholder导致第一次不显示网络图片,只显示默认图片的问题
                .centerCrop()
                .into(holder.civ_head);//加载用户头像
        holder.layout_slide.setSwipMenuClickListener(new MyConcernHorizontalSlideLayout.SwipMenuClickListener() {
            @Override
            public void clickEvent(int index) {
                switch (index) {
                    case 0:
                        if (operatorCallback != null)
                            operatorCallback.centerViewClicked(userNo, analystNo);
                        break;
                    case 1:
                        if (operatorCallback != null)
                            operatorCallback.cancelFollowClicked(analystNo);
                        break;
                }
            }
        });
    }

    //重写getViewType

    private final static int VIEW_TYPE_0 = 0x01;
    private final static int VIEW_TYPE_others = 0x02;

    @Override
    public int getItemViewType(int position) {
        if (position == 0) {// d处于0位置的item
            if (!ifAlloweSwip)//根据这个变量判定是不是头，如果可滑动，就不需要头，所以这里就返回正常item,否则。就是返回头
                return VIEW_TYPE_0;
            else
                return VIEW_TYPE_others;
        } else {
            return VIEW_TYPE_others;
        }
    }


    /**
     * adapter中的事点击，反馈给外界
     */
    private OperatorCallback operatorCallback;

    public void setOperatorCallback(OperatorCallback callback) {
        this.operatorCallback = callback;
    }

    public interface OperatorCallback {
        void centerViewClicked(String userNo, String analystNo);

        void cancelFollowClicked(String analystNo);

        /**
         * 当分析师的选中状态发生变化时
         *
         * @param ifChecked
         */
        void analystCheckedChanged(String analystNo, boolean ifChecked);

        void quickFollowAnalyst();
    }

    /**
     * 设置item的总数
     *
     * @return
     */
    @Override
    public int getItemCount() {//返回item的总个数
        if (analystList == null) return 0;
        return analystList.size();
    }


}
